#include "log.h"

bool bInitLog = false ;

bool initLog ()
{
    if (bInitLog)
        return true ;

    // 1 读取解析配置文件
    // 读取出错, 完全可以忽略，可以定义一个缺省策略或者使用系统缺省策略
    // BasicLayout输出所有优先级日志到ConsoleAppender
    try { 
        log4cpp::PropertyConfigurator::configure(HOMEPATH "/lib/log/log4cpp.properties");
    } catch(log4cpp::ConfigureFailure& f) {
        std::cout << "Configure Problem " << f.what() << std::endl;
        return false;
    }
    
 /*   // 2 实例化category对象
    // 这些对象即使配置文件没有定义也可以使用，不过其属性继承其父category
    // 通常使用引用可能不太方便，可以使用指针，以后做指针使用
    // log4cpp::Category* root = &log4cpp::Category::getRoot();
    log4cpp::Category& root = log4cpp::Category::getRoot();
    
    log4cpp::Category& console = 
        log4cpp::Category::getInstance(std::string("console"));
    // 3 正常使用这些category对象进行日志处理。
    // file has appender A1 and rootappender.
    console.info("This is some info\n");
    console.alert("A warning\n");
    
    // console only have both file appender(inherited from root) and console appender.
    console.debug("This debug message will fail to write\n");
    console.alert("All hands abandon ship\n");
    console.critStream() << "This will show up << as " << 1 << " critical message\n";
    console << log4cpp::Priority::ERROR 
              << "And this will be an error\n"  ;
    console.log(log4cpp::Priority::WARN, "This will be a logged warning\n");
 */
    bInitLog = true ;
    return true;
}

LogInstance & getConsoleLog ( )
{
    if (!bInitLog)
        initLog();

    // 2 实例化category对象
    // 这些对象即使配置文件没有定义也可以使用，不过其属性继承其父category
    // 通常使用引用可能不太方便，可以使用指针，以后做指针使用
    // log4cpp::Category* root = &log4cpp::Category::getRoot();
    return log4cpp::Category::getInstance(std::string("console"));
}

LogInstance &  getFileLog ( )
{
    if (!bInitLog)
        initLog() ;

    // 2 实例化category对象
    // 这些对象即使配置文件没有定义也可以使用，不过其属性继承其父category
    // 通常使用引用可能不太方便，可以使用指针，以后做指针使用
    // log4cpp::Category* root = &log4cpp::Category::getRoot();
    return log4cpp::Category::getRoot();
}

